package cn.edu.lcu.cs.ssm.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * <p>
 * 数据库工具类，获取数据库连接
 * </p>
 * <p>
 * 在SSM集成中是用不到这个工具类的，此例仅用于演示Spring中的某些功能
 * </p>
 * 
 * @author ling
 *
 */
// 声明为Spring的一个普通Bean。
// 如果没有声明Bean的名称，默认为类名（首字母小写），不过也有例外，比如本例的默认Bean名称就是 DBUtil，首字母没有小写
@Component 
@Scope("singleton") // 指定Bean的范围，默认是单例模式。可选的值：singleton prototype request session globalSession
@PropertySource("classpath:config.properties") // 指定属性文件
public class DBUtil {
	@Value("${db.driver}") // 注入属性文件中的属性
	private String driverClassName;
	@Value("${db.url}")
	private String url;
	@Value("${db.username}")
	private String user;
	@Value("${db.password}")
	private String password;

	/**
	 * <li>@PostConstruct 注解通知Spring，在调用完此类的构造方法之后，即创建此类的实例后，执行本方法。</li>
	 * <li>因为Spring中的Bean默认是单例模式，即本类只会有一个实例，构造方法只会被调用一次</li>
	 * <li>所以本初始化方法也只被调用一次</li>
	 * <li>相当于传统模式中的静态初始化块的工作</li>
	 */
	@PostConstruct
	private void init() {
		try {
			Class.forName(driverClassName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @return
	 */
	public Connection getConnection() {
		Connection connection = null;
		try {
			connection = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}

}
